iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0

為了順利地編寫 Go,重要的是要理解他的獨特特性和設計哲學,而不僅僅是將其他語言的程式碼翻譯成 Go。

換句話說,要在 Go 中寫出不錯的程式,需要以 Go 的思維方式來思考問題,並遵循他的規範與原則。這樣可以確保程式易於閱讀、維護並與其他Go程式協同工作。

先練習閱讀文擋

這邊我想用官方提供的 Effective Go 來作延伸,這是學習 Golang 程式碼的重要指南,將探討幾個關鍵主題,包括格式化、注釋、命名和分號的使用。這些主題不僅關係到程式碼的外觀和風格,還影響到程式碼的可讀性、可維護性和品質。

1. 格式化 Formatting:

Go 提供了 gofmt 工具,它會自動格式化程式碼,使其遵循一致的樣式和風格。

這邊我們可以注意到這個結構裡的型別與註釋接沒有整齊排列,然而在編寫程式碼時,誰還想花更多時間在處理擾人的格式?

type User struct{
    ID int // User's Id
    Name string // User's name
    Email string // User's email
}

此時,gofmt 將為你服務!且只要是 Standard packages 皆支援

type User struct {
	ID    int    // User's Id
	Name  string // User's name
	Email string // User's email
}

All Go code in the standard packages has been formatted with gofmt.

2. 注釋 Commentary:

注釋要是有意義的,而不僅僅是重複程式碼已經表達的事實。儘量避免冗長的注釋。注釋應該解釋為什麼某事這樣實現,而不是只描述它是如何實現的。
可使用支持C 風格的/* */ 和 C++ 风格的行注释 //

舉例

// from initDB
// connectToDB tries to connect to postgres, and backs off until a connection
// is made, or we have not connected after 10 tries
func connectToDB() *sql.DB {

3. 命名 Names:

好的名稱是程式碼的關鍵。變數、函數、類型和常數的名稱應具有描述性,以便其他人容易理解您的程式碼。

(1) 封包名 Package names:

import "fmt"

之後,可透過 fmt.Println 來使用

(2) 讀取 Getters:

在 Go 語言中,Getter 是一種命名慣例,用於命名一個方法,該方法用於 讀取 未導出 變數的值。

type Person struct {
	name string // 私有變數
}

// Getter 方法,用於獲取 name 的值
func (p *Person) GetName() string {
	return p.name

(3) 介面名稱 Interface names:

介面是一種定義方法集合的抽象類型。這個原則主要針對只包含一個方法的介面,並建議使用特定的命名風格。
在方法名稱上加上 -er 構建一個代理名詞
舉例:

package main

import "fmt"

// Reader 介面,只包含一個 Read 方法
type Reader interface {
    Read() string
}

// FileReader 實現了 Reader 介面
type FileReader struct {
    content string
}

// 實現了 Reader 介面的 Read 方法
// Read 方法返回了 FileReader 結構的 content 字串。
func (fr FileReader) Read() string {
    return fr.content
}

func main() {
    // 將 "Hello, World!" 賦值給 content。
    file := FileReader{content: "Hello, World!"}
    // 定義了一個變數 reader,其類型是 Reader 介面。
    var reader Reader

    // 將 file(FileReader)賦值給 reader
    reader = file // FileReader 實現了 Reader 介面
    // 呼叫 reader.Read(),該方法 call 了 FileReader 結構的 Read 方法
    content := reader.Read()
    // 並印出 Hello World
    fmt.Println(content)
}

(4) 駝峰式 MixedCaps:

駝峰記法有兩種:MixedCaps(混合大寫)和 mixedCaps(小寫開頭混合大寫)。

// MixedCaps 混合大寫
type HTTPRequestHandler struct {
}

func MyFunctionName() {
}

// mixedCaps mixedCaps 小寫開頭混合大寫
var myVariableName int

func processHTTPRequest() {
}

4. 分號 Semicolons:

Go 語言不需要顯式分號 ; 來結束語句,因為它使用自動分號插入 automatic semicolon insertion
故,不必在每個語句的末尾添加分號。只有在多個語句在同一行時才需要分號。

不應將控制結構(如 if、for、switch、select)的左大括號放在下一行。

碎語

其實我一開始學習時,確實忽略了這個步驟。而我認為在真的開始寫程式之前,了解官方規範並遵循原則,往後編寫時才不會因為不理解而花更多時間成本尋找基本的規範。
今天稍微介紹 Effective Go 的前面幾個主題,若想更仔細的了解,可以透過超連結到官網閱讀。
我也正在學習路上,如內容有誤還請各位前輩與大神批評指教。
謝謝今日的閱讀,我們明天見!


上一篇
02 | 老派的起手式 "Hello World!"
下一篇
04 | 對程式碼理性的 PUA
系列文
Go 語言學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言